package com.basker.pisces.orm.execute;

import java.util.List;
import java.util.Map;

import com.basker.pisces.core.RowContract;
import com.basker.pisces.core.meta.row.RowContractMeta;
import com.basker.pisces.orm.data.DataTable;
import com.basker.pisces.orm.data.meta.TableMeta;

/**
 * Sql语句的执行器，内部封装了数据库访问层
 *
 * @author hangwen
 */
public interface ISqlExecutor {

    /**
     * 执行批量操作语句
     *
     * @param sql       操作语句 包括insert、update、delete
     * @param batchArgs 批量参数值
     * @param argTypes  参数类型
     * @return
     */
    int[] batchUpdate(String sql, List<Object[]> batchArgs, int[] argTypes);

    /**
     * 执行任意sql
     *
     * @param sql
     */
    void execute(String sql);

    /**
     * 根据数据表的元信息，执行sql，将查询结果填充到{@link DataTable}中
     *
     * @param tableMeta 数据表的元信息
     * @param sql       查询sql，需要与tableMeta的结构匹配
     * @param args      参数值
     * @param argTypes  参数类型
     * @return
     */
    DataTable queryForDataTable(TableMeta tableMeta, String sql, Object[] args, int[] argTypes);

    /**
     * 执行查询sql，返回多条记录,每条记录以Map的方式返回
     *
     * @param sql      查询语句
     * @param args     参数值
     * @param argTypes 参数值的类型
     * @return
     */
    List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes);

    /**
     * 执行查询sql，返回一条记录
     *
     * @param sql      查询语句
     * @param args     参数值
     * @param argTypes 参数值的类型
     * @return
     */
    Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes);

    /**
     * 执行查询sql,返回单行单列
     *
     * @param <TResult>
     * @param requiredType
     * @param sql
     * @param args
     * @param argTypes
     * @return
     */
    <TResult> TResult queryForObject(Class<TResult> requiredType, String sql, Object[] args, int[] argTypes);

    /**
     * 执行查询sql,返回多条记录,每条记录以RowContract的方式返回
     *
     * @param rowMeta  填充行的元数据
     * @param sql
     * @param args
     * @param argTypes
     * @return
     */
    List<RowContract> queryForRows(RowContractMeta rowMeta, String sql, Object[] args, int[] argTypes);

    /**
     * 执行一句操作语句
     *
     * @param sql      操作语句 包括insert、update、delete
     * @param args     参数值
     * @param argTypes 参数类型
     * @return
     */
    int update(String sql, Object[] args, int[] argTypes);
}
